
#ifndef DATA_EN
#define DATA_EN
#include"../Global.h"
#include "../DataCollect/DataCollect.h"
#include"../Domain/SendFrameClientMsg/FrameMsg.pb.h"
#include"../CommonUtils/ThreadPool/HzThreadPool.h"
extern "C"
{
#include <libavcodec/avcodec.h>
#include <libavutil/opt.h>
}
#define Packet_Size 512
class SendFrameClient;

class DataEncoding
{
public:
    DataEncoding();
    DataEncoding(SendFrameClient* sendFrameClt,enum AVCodecID id,int width,int height,int framerate,enum AVPixelFormat inputFigFormat,DataCollect* dataCollect);
    ~DataEncoding();
public:

    /// @brief  初始化编码器
    /// @return  
    int init_encode_core();

    /// @brief 释放资源
    /// @return 
    int release_encode_core();
public:

    /// \brief 主运行程序
    /// \return
    int run();

    /// @brief 这是在另一个线程，开始编码
    /// @param thiz 
    void start_encode();

    /// @brief 发送一个frame到上下文   flush = true：结束标志
    /// @param flush 
    /// @return 
    int send_a_frame(bool flush);


    /// @brief    从上下文获取编码后的码流
    /// @return   0：成功获取   -1 读取发生错误   else：码流不可用或已结束
    int recv_the_pkt();




public:
    SendFrameClient* sendFrameClt;
    DataCollect* dataCollect;
    enum AVCodecID id;      //编码器ID
    enum AVPixelFormat inputFigFormat;    //输入图片格式
    int width, height, framerate;    //长宽、帧率
    string codec_name;            // 编码器名称
    const AVCodec *codec;         // 编码器描述结构体
    AVCodecContext *codecContext; // 上下文
    AVFrame *frame;               // 帧存储
    AVPacket *pkt;                // 码流结构体
    std::mutex readContextMutex;             //读写锁
    HzThreadPool* pool;//线程池，用于发送编码后的帧到控制端
};


#endif
